/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.dao;

import br.com.deployment.daogenerico.DaoGenerico;
import br.com.deployment.entidade.acesso.Usuario;
import br.com.deployment.entidade.selo.Distribuicao;
import br.com.deployment.entidade.selo.Selo;
import br.com.deployment.entidade.selo.TipoSelo;
import br.com.deployment.interfaces.DistribuicaoDaoIn;
import br.com.deployment.utilitario.DistribuirSelos;
import br.com.deployment.utilitario.Msg;
import br.com.deployment.utilitario.ResulDistribuicao;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author elyjr
 */
@Stateless
@LocalBean
public class DistribuicaoDao extends DaoGenerico<Distribuicao> implements DistribuicaoDaoIn{

    public DistribuicaoDao() {
        super(Distribuicao.class);
    }

    public List<Distribuicao> findRecebedor(Usuario recebedor) {
        List<Distribuicao> lista = new ArrayList<Distribuicao>();
        String sql = "Select d from Distribuicao d JOIN d.recebedor rec"
                + " where rec.id = :user"
                + " ORDER BY d.id DESC";
        Query query = getEm().createQuery(sql);
        query.setParameter("user", recebedor.getId());
        lista = query.getResultList();
        System.err.println(lista);
        System.err.println(sql);
        return lista;
    }

    public List<Distribuicao> findAll() {
        List<Distribuicao> lista = new ArrayList<Distribuicao>();
        String sql = "Select d from Distribuicao d "
                + " ORDER BY d.id ASC";
        Query query = getEm().createQuery(sql);
        lista = query.getResultList();

        return lista;
    }

    public List<Distribuicao> findTipoEnd(Distribuicao dis) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<Selo> atribuirSelos(TipoSelo tipoSelo, int qtd) {
        List<Selo> lista = new ArrayList<Selo>();
        String sql = "Select s from Selo s JOIN s.tipoSelo ts"
                + " where ts.id = :tipoSelo and"
                + " s.distribuido = false "
                + " ORDER BY s.id ASC";

        Query query = getEm().createQuery(sql).setMaxResults(qtd);

        query.setParameter("tipoSelo", tipoSelo.getId());

        lista = query.getResultList();
        System.err.println("Selos::::" + lista);

        return lista;
    }

    public Long qtdSelo(Usuario u, TipoSelo tSelo) {
        Long qtd = 0L;
        String sql = "select count(s) from Distribuicao dist JOIN dist.listSelo s JOIN s.tipoSelo ts "
                + " JOIN dist.recebedor ur where"
                + " ur.nome = :nome and"
                + " ts.id = :id and"
                + " s.ativo = true and s.protocolado = false";        
        Query query = getEm().createQuery(sql);        
        query.setParameter("nome", u.getNome());
        query.setParameter("id", tSelo.getId());
        qtd = (Long) query.getSingleResult();
        System.err.println(sql);
        return qtd;
    }

    public List<Selo> meusSelo(Usuario u, TipoSelo tSelo) {
        List<Selo> lista = new ArrayList<Selo>();
        String sql = "select s from Distribuicao dist JOIN dist.listSelo s"
                + " JOIN dist.executante ur where"
                + " ur.nome = :nome";
        Query query = getEm().createQuery(sql);
        query.setParameter("nome", u.getNome());
        lista = query.getResultList();
        System.err.println(sql);
        return lista;
    }

    public Boolean containsSelo(TipoSelo tSelo, Integer qtd) {
        String sql = "select count(s) from Selo s JOIN s.tipoSelo ts "
                + " where ts.id = :tipoSelo and s.protocolado = false and s.ativo = true "
                + " and s.distribuido = false";
        Query query = getEm().createQuery(sql);
        query.setParameter("tipoSelo", tSelo.getId());

        if (qtd <= Integer.valueOf(query.getSingleResult().toString())) {
            return true;
        }
        return false;
    }

    public List<Selo> getSelos(TipoSelo ts, Distribuicao d) {
        System.err.println("Tipo:" + ts);
        List<Selo> listTs = new ArrayList<Selo>();

        String sql = " select ls from Distribuicao d JOIN d.listSelo ls "
                + "     JOIN ls.tipoSelo ts where ts.id = :id and d.id = :idD";

        Query query = getEm().createQuery(sql);
        query.setParameter("id", ts.getId());
        query.setParameter("idD", d.getId());
        listTs = query.getResultList();

        for (Selo selo : listTs) {
            System.err.println("ListSelo: " + listTs.size());
            
        }

        return listTs;
    }

    public List<TipoSelo> verificarTipoSelo(Distribuicao d) {
        List<TipoSelo> listTs = new ArrayList<TipoSelo>();

        String sql1 = "select ts from Distribuicao d JOIN d.listSelo ls JOIN ls.tipoSelo ts where d.id = :id group by ts";

        Query query = getEm().createQuery(sql1);
        query.setParameter("id", d.getId());
        listTs = query.getResultList();

        return listTs;
    }

    // Método não está sendo usado
    public void distribuirSelos(List<DistribuirSelos> list, List<ResulDistribuicao> resulDis, List<Selo> lstSeloAll) {
        ResulDistribuicao rd = new ResulDistribuicao();
        for (DistribuirSelos dselo : list) {
            rd.setTipoSelo(dselo.getTipoSelo());
            List<Selo> lstSelos = new ArrayList<Selo>();
            lstSelos = atribuirSelos(dselo.getTipoSelo(), dselo.getQuantidade());
            rd.setSelo(lstSelos);
            resulDis.add(rd);
            rd = new ResulDistribuicao();
            if (!lstSelos.isEmpty()) {
                for (Selo selo : lstSelos) {
                    selo.setDistribuido(true);
                    lstSeloAll.add(selo);
                }
            } else {
                Msg.messagemInfo("Distribuição Incompleta, não possui selos no estoque!");
            }
        }
    }

    public List<Selo> selosDistribuicao(Distribuicao dis) {
        List<Selo> list = new ArrayList<Selo>();
        String sql = "select  ls from Distribuicao d JOIN d.listSelo ls where d.id = :id";
        Query query = getEm().createQuery(sql);
        query.setParameter("id", dis.getId());
        list = query.getResultList();
        return list;
    }

    public List<TipoSelo> editarDistribuicao(Distribuicao dis) {
        List<TipoSelo> list = new ArrayList<TipoSelo>();
        String sql = "select distinct ts from Distribuicao d JOIN d.listSelo ls JOIN ls.tipoSelo ts where d.id = :id";
        Query query = getEm().createQuery(sql);
        query.setParameter("id", dis.getId());
        list = query.getResultList();
        return list;
    }

    public TipoSelo agrupando(TipoSelo tipoSelo) {

        return null;
    }

    public int count(TipoSelo tipoSelo) {
        int qtd = 0;
        String sql = "select count(ts) from Distribuicao d JOIN d.listSelo ls JOIN ls.tipoSelo ts where ts.id = :id";
        Query query = getEm().createQuery(sql);
        query.setParameter("id", tipoSelo.getId());

        return qtd = Integer.valueOf(query.getSingleResult().toString());

    }

    public List<Selo> tipoSeloListaSelos(TipoSelo tselo, Distribuicao dis) {
        List<Selo> Selo = new ArrayList<Selo>();
        String sql = "select s.tipoSelo from Selo s where s.tipoSelo.id = :id "
                + "and s.distribuicao.id = :idDis";
        Query query = getEm().createQuery(sql);
        query.setParameter("id", tselo.getId());
        query.setParameter("idDis", dis.getId());
        Selo = query.getResultList();
        return Selo;
    }

    public List<Distribuicao> pesquisaDistribuicao(Distribuicao distribuicao) {

        List<Distribuicao> list = new ArrayList<Distribuicao>();

        String sql = "select d from Distribuicao d where ";

        if (distribuicao.getRecebedor().getNome() != null && distribuicao.getRecebedor().getNome() != "") {
            sql += "   lower(d.recebedor.nome) like lower(?1) and"; // faltando o and 
        }
        if (distribuicao.getDataDistribuicao() != null) {
            sql += "   d.dataDistribuicao = :data and";
        }

        sql += " 1=1 ";

        Query query = getEm().createQuery(sql);
        if (distribuicao.getRecebedor().getNome() != null && distribuicao.getRecebedor().getNome() != "") {
            query.setParameter("1", "%" + distribuicao.getRecebedor().getNome() + "%");
        }

        if (distribuicao.getDataDistribuicao() != null) {
            query.setParameter("data", distribuicao.getDataDistribuicao());
        }


        list = query.getResultList();
        System.out.println(sql);
        return list;
    }
    // select ls from Distribuicao d JOIN d.listSelo ls JOIN ls.tipoSelo ts where ts.id = :id";
}
